package com.wyf.springmvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;

/**
 * 请求转发和重定向
 * SpringMVC内部默认采用请求转发
 *
 * 请求转发：
 *   地址栏不发生改变，以forward开头
 *   方法有2种返回值
 *    1. 返回ModelAndView对象
 *    2. 返回试图名字字符串
 *    注：默认都会从事图解析器设置的路径下查找指定的试图（不需要写后缀名）
 *        如果想从根目录下寻找，需要使用forward:{视图名、控制器名}
 * 重定向：
 *   地址栏会发生改变，以redirect开头
 */

@Controller
public class JumpController {

    /**
     * 请求转发跳转的是一个jsp页面
     * 默认采用请求转发，会在试图解析器中设定的路径下查找指定的试图
     * （在 WEB-INF/jsp目录下查找对应的jsp文件）
     * @return
     */
    @RequestMapping("/view01")
    public ModelAndView view01() {
        ModelAndView modelAndView = new ModelAndView();
        // 数据模型
        modelAndView.addObject("msg", "请求转发1...");
        // 设置试图
        modelAndView.setViewName("test");
        return modelAndView;
    }

    /**
     * 请求转发跳转jsp页面
     * 使用forward：页面名转发
     * 此时会从项目的根路径（webapp目录）下查找指定页面
     * @return
     */
    @RequestMapping("/view02")
    public ModelAndView view02() {
        ModelAndView modelAndView = new ModelAndView();
        // 数据模型
        modelAndView.addObject("msg", "请求转发2...");
        // 设置试图
        modelAndView.setViewName("forward:WEB-INF/jsp/test.jsp");
        return modelAndView;
    }

    /**
     * 如果传递参数，在页面中可以通过￥{param,参数名} 获取对应的参数
     * @return
     */
    @RequestMapping("/view03")
    public ModelAndView view03() {
        ModelAndView modelAndView = new ModelAndView();
        // 数据模型
        modelAndView.addObject("msg", "请求转发3...");
        // 设置试图
        modelAndView.setViewName("forward:WEB-INF/jsp/test.jsp?uname=zhangsan");
        return modelAndView;
    }

    /**
     * 转发到控制器
     * 使用forward：路径 转发，此时会从项目的根路径来查找指定的控制器
     * 返回ModelAndView对象
     * @return
     */
    @RequestMapping("/view04")
    public ModelAndView view04() {
        ModelAndView modelAndView = new ModelAndView();
        // 数据模型
        modelAndView.addObject("msg", "请求转发4...");
        // 设置试图
        modelAndView.setViewName("forward:hello");
        return modelAndView;
    }

    /**
     * 请求转发到jsp页面
     *   默认会从试图解析器设定的路径下查找
     * 返回视图名字符串
     *
     * 常用对象可以设置到方法的形参中，直接使用
     *
     * @return
     */
    @RequestMapping("/view05")
    public String view05(HttpServletRequest request) {
        // 设置是试图模型
        request.setAttribute("msg", "请求转发5...");
        return "test";
    }

    /**
     * 请求转发到jsp页面
     *   使用forward：页面名转发
     * 此时会从项目的根路径（webapp目录）下查找指定页面
     *
     * 常用对象可以设置到方法的形参中，直接使用
     *
     * @return
     */
    @RequestMapping("/view06")
    public String view06(HttpServletRequest request) {
        // 设置是试图模型
        request.setAttribute("msg", "请求转发6...");
        return "forward:index.jsp";
    }

    /**
     * 请求转发到控制器
     *   使用forward:路径 转发，此时会从项目的根路径下查找指定的控制器
     * 返回控制器的字符串
     *
     * 常用对象可以设置到方法的形参中，直接使用
     *
     * @return
     */
    @RequestMapping("/view07")
    public String view07(HttpServletRequest request) {
        // 设置是试图模型
        request.setAttribute("msg", "请求转发7...");
        return "forward:hello";
    }
}

